第一天
你不可不知的那些小事情 - 生態現況與基本常識
敘事與程式的關係
故事 1:
角色:
Alex => father
Howard => son
故事:
Howard => 肚子餓 => 叫爸爸 => Alex 煮飯
1 | Howard.addEventListener(肚子餓,叫爸爸) |
ECMAScript vs JavaScript
LiveScript 跟風 Java 改名 JavaScript
ECMAScript 是規範版本的名稱 Ex : ECMAScript 6
網頁三腳督
HTML + CSS + JavaScript
Javascript 負責事情 1.功能操作 2.動畫 (能用 Css 做就用 Css 做)css 效能比較好用 3.資料處理
BOM vs DOM
BOM(Browser Object Model):操作瀏覽器
Ex: window.navigator , window.location … 等
DOM(Document Object Model):操作網頁內容(大部分是標籤)
Ex: div, style … 等 tag
資料處理
一般在撰寫上要考量要操作哪部分
範例 1
JavaScript 寫在哪裡? 都可以?
位置:
- HTML 外面
- HTML 裡面
- HTML 裡面 HEAD 裡面
- HTML 裡面 BODY 裡面
瀏覽器會將上面全都拉近 BODY 裡面 => 建議放在 BODY 結束前
script 包出一個區域做撰寫程式地方
依照順序由上到下的方式去依序執行
最基本類型
- 文字 String
- 數字 Number
- 布林 Boolean
- 空值 Null
- 未定義 Undefined
如果 HTML 畫面完成再執行 document.write,會把整個畫面清掉從 write
範例 2
1.宣告:新增(取名字) 2.先宣告後使用! (重要
3.var(可改變) let(可改變) const(常數不會變) 4.資料轉換 5.作用域
1 | var a = 123; // 宣告 a 變數 等於 123 |
a += 2;(簡寫) => a = a + 2;(完整) //在不熟的狀態下不要用簡寫
1 | //作用域範圍 |
作用域使用
Why 使用作用域 : 因為網頁內容若能被調整, 容易造成網頁內容不安全
- block
es6 使用一對大括號{} =>裡面只能用 let 跟 const - IIFE
(function(){…})();
function 函式
宣告方式
1.
1 | function 函式名稱(...參數) { |
它會有提升 (hoisting) 現象,,像這樣:
1 | greet(); |
2.
- 優點
- 函式在宣告時,才產生出來
- 較符合先宣告後使用的習慣
1 | let xxx = function() { |
Chrome & Vscode Tips
Chrome 下斷點
記得要重新整理
vscode 快捷鍵
左方小齒輪 -> 中文 : 使用者程式碼片段 , 英文 : User Snippets
1 | "IIFE": { |
vscode 顯示設定 (專案)
1 | { |
Reference
那些該死的運算與轉換 - 資料類型與操作
數學運算與回傳
運算式
運算元(運算的值 ex:數字
運算子(怎麼算 ex:+-=
- 賦值運算子 (一般都會改變內容)
1 | let a = 1 // 將1賦予a |
算術運算子
字串運算子
1 | 如果有字串會字串優先; |
轉換表
if 條件判斷式
1 | // 肚子餓 |
1 | let 肚子 = 40; |
1 | let 肚子 = 60; |
1 | let 肚子 = 70; |
完整 Code (Alex 版)
1 | // 肚子餓 |
switch 條件判斷式(進入點)
1 | let 肚子飢餓程度 = 4; // 4,3,2,1 |
補充 (二進位 與 Bitwise)
1 | // 二進位 |
寫程式建議步驟
1.思考 2.畫圖 3.寫程式
範例 3 window
- window.alert ( 跳訊息 )
- window.confirm ( 跳確認,回傳布林值 )
- window.prompt ( 跳輸入框,回傳輸入內容 )
1 | // 請輸入你的程式 |
來人阿!開工吧 - DOM 與事件操作
三劍客
1.Who
2.What
3.When
認識 function 做點事
加上小括號會馬上做
所以在監聽後面不需要加括號
ex: addEventListener("click", greeting);
getElement 與 query
getElement:
1.getElementById (效能較佳,但須考量效率)
2.getElementByClassName => collection (動態更新/無法跑迴圈)
3.getElementByTagName
query:
1.querySelector
2.querySelectorAll => list (靜態不變/有 forEach)
事件
範例 4
1 | function greeting() { |
&& / ||
可以拿來做判斷式 , 也能拿來流程控管
1 | // 有不做就不做 |
範例 5
- 程式盡量不要有大量相同的 Code => 整理
- 快速大量選取快捷鍵 => ctrl+d (選) ctrl+k(不選)
- 怎麼選東西很重要
- forEach 參數名稱是自己取的
- capture => target => bubble
滑鼠進入/離開事件
1.mouseover/mouseout =>
(1) 在乎的是 Taget (會產生畫面一直跳)
(2) 會冒泡 (bubble)
(3) addEventListener 把 useCapture 設 true 就會反向
Target : https://developer.mozilla.org/zh-TW/docs/Web/API/Event/target
2.mouseenter/mouseleave =>
(1) 在乎的是 currentTarget (綁定事件的東西)
(2) 不會冒泡 (bubble)
***根據需要針對對象選擇
字串運算 => 先挖洞在左右補+
1 | // querySelectorAll 迴圈處理 |
this
- 事件偵聽的 this
who => when =>what
呼叫事件的人(currentTarget)
圖片的範例
this => bronze currentTarget
(e.currentTarget => 事件綁定的對象)
箭頭函式沒有 this
this => js 對象
- \$(this) => jq 對象
三元運算
1 | check ? a : b; |
current 綁定事件那一個
target 最深那一層的 DOM
mouseenter 不會有 bubble(不會有冒泡)
alex example
***使用 div.id.length 做判斷
=> 思考兩組需要綁定的差異,設定 id 長度不同,所以用這個來做區分
範例 6
- 要畫有幫助思考的流程圖(不同事件差異要出來
- 迴圈中寫 function 會產生多組重複 function
- substr : 切西瓜 (第一刀位置,切多少字)
- NodList 沒有 indexOf 要用 […NodeList] 轉成 List
- 轉數字 : *1 -0 /1 parseInt()
藍色是正確方式
按(找人) => 換號(依照不同人用不同方式) => 換圖
substr(重哪裡切,切多寬)
當數字超過(過大或過小時)有兩種選擇:下面寫法為第一種選擇
(1) 過大回到 0,過小回到最後 (一種迴圈)
(2) 過大停在最後,過小停在 0 (前後不動)
1.改在 changeView() (改變選圖時)
1 | let imgLength = imges.length; |
2.改在產生 imgNumber 時(改計算時)
1 | // imges.length = 5 |
// 結合 prev 跟 next
1 | case "prev": |
1 | let map = { |
== 與 ===
== : 等於
=== : 完全等於
1 | let a = 1; |
箭頭函式
() => {} // 一行時{}可以省略
1 | (msg => console.log(msg))(123); |
這包東西不簡單 - 陣列與物件的管理應用
一坨與一串東西的特性
資料紀錄
通常無法確認多語系要用哪個語言顯示,盡量使用中性資料 EX:數字
1 | // 物件 管理一個對象 (可以指向特定Key Key Value) |
範例 7
- CSR(Client Side Rendom) VS SSR(Server Side Rendom)
SSR:網頁檢視原始碼看到的(程式產資料)
CSR:網頁檢視原始碼不一定看得到(資料產程式) - 物件(一根香蕉) VS 陣列(一串香蕉)
- 陣列操作
- 計時器 setTimeout(做一次) / setInterval(一直做)
資料塞入 DOM => 初始化畫面
麥當勞點餐
現在:點完去旁邊點餐 (非同步
以前:點完好了再下一位(同步
遞迴 => 自己呼叫自己
範例 9
- 輸入 => 送出(button) => 抽籤
- click(要自己檢查資料) / submit(form 送出)
- slice 切出新的陣列 / splice 切原始陣列 (處理陣列)
slice 不改變原本陣列
splice 會改變12 - split 針對 string 處理切割
1 | let a = [1, 2, 3, 4, 5]; |
你怎麼說我怎麼做 - 條件判斷與流程控制
for 迴圈 vs while 迴圈
1 | let ary = [1, 2, 3, 4, 5]; |
遞迴
1.往前走(呼叫自己) 2.有 return 條件 3.邊界條件
範例 10
- 階乘 輸入 5 拿到(5!) 5 _ 4 _ 3 _ 2 _ 1
1 | // for |
- fibonacci : 前兩個是 1,第三個開始為前兩個和
1 | // 使用while迴圈取出fibonacci |
1 | //EX: fibonacci(5) |